package pms.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;


import pms.dto.RennenDTO;
import pms.om.Rennen;

public class RennenDao extends HibernateDaoSupport {
	private RennstatistikDao rennstatistikDao;
	private RennlaeuferDao rennlaeuferDao;
	
	public void setRennstatistikDao(RennstatistikDao rennstatistikDao) {
		this.rennstatistikDao = rennstatistikDao;
	}

	public void setRennlaeuferDao(RennlaeuferDao rennlaeuferDao) {
		this.rennlaeuferDao = rennlaeuferDao;
	}

	public Rennen findById(int id) {
		HibernateTemplate template = getHibernateTemplate();
		return (Rennen) template.get(Rennen.class, id);
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Rennen> findAll() {
		HibernateTemplate template = getHibernateTemplate();
		return template.loadAll(Rennen.class);
	}

	public Object findAllDTO() {
		List<RennenDTO> result = new LinkedList<RennenDTO>();
		for (Rennen r : findAll()) {
			result.add(new RennenDTO(r));
		}
		return result;
	}

	public void modify(int id, String ort, String datum, String bez, String platz) {
		HibernateTemplate template = getHibernateTemplate();
		Rennen rennen = (Rennen) template.get(Rennen.class, id);
		rennen.setRennort(ort);
		rennen.setRennbezeichnung(bez);
		rennen.setBusplatz(platz);
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
		try {
			rennen.setRenndatum(sdf.parse(datum));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();  //=> Handling eintragen
		}
		template.saveOrUpdate(rennen);
		
	}


	public void create(String datum, String ort, String bez, String platz) {
		HibernateTemplate template = getHibernateTemplate();
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
		Date dat = new Date();
		try {
			dat = sdf.parse(datum);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();  //=> Handling eintragen
		}
		
		Rennen rennen = new Rennen(dat, ort, bez, platz); 
		template.persist(rennen);
	}
	
	/**
	 * returns the list of rennen .
	 * @return a List of Rennen
	 */
//	@SuppressWarnings("unchecked")
//	public List<Boot> findFreie() {
//		HibernateTemplate template = getHibernateTemplate();
//		List<Fahrt> aktuelleRennen = template.find("from Fahrt f where f.ankunft is null");
//		List<Rennen> alle = template.loadAll(Rennen.class);
//		List<Rennen> result = new LinkedList<Rennen>();
//		List<Rennen> belegteBoote = new LinkedList<Rennen>();
//		for (Fahrt fahrt : aktuelleRennen) {
//			belegteRennen.add(fahrt.getRennen());
//		}
//		for (Boot boot : alle) {
//			if (!belegteBoote.contains(boot)) {
//				result.add(boot);
//			}
//		}
//		return result;
//	}

	public void deleteById(int id) throws BootDeleteException {
		HibernateTemplate template = getHibernateTemplate();
		Rennen b = findById(id);
//		Set<Rennen> rennen = b;
//		if (rennen == null || rennen.size() == 0) {
			template.delete(b);
//		} else {
//			throw new BootDeleteException();
//		}
	}


	public void konfiguriere(int id, String[] rennlaeuferIds) {
		Rennen rennen = findById(id);
		for (String riString : rennlaeuferIds) {
			int ri = Integer.parseInt(riString);
			this.rennstatistikDao.create(rennen, rennlaeuferDao.findById(ri));
		}
	}

}